/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.Ufes.exeSwing.Presenter;

import edu.Ufes.exeSwing.Collection.ContaCollection;
import edu.Ufes.exeSwing.View.InclusaoContaView;
import edu.Ufes.exeSwing.Model.Conta;
import edu.Ufes.exeSwing.Persistence.ContaPersistence;
import edu.Ufes.exeSwing.View.ListaAgenciasView;
import edu.Ufes.exeSwing.View.ListaContasView;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.TreeSet;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author bhetynnacatalunha
 */
public class ContaPresenter {

    InclusaoContaView inclusaoContaView;
    ContaCollection contas;
    ListaContasView listaContasView;
    DefaultTableModel tm;

    public ContaPresenter() {

        inclusaoContaView = new InclusaoContaView();
        contas = new ContaCollection(new ContaPersistence());
        listaContasView = new ListaContasView();

        inclusaoContaView.getBtnSalvar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                salvarConta();
            }
        });

        inclusaoContaView.getBtnFechar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                inclusaoContaView.dispose();
            }
        });

        listaContasView.getBtnNova().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                inclusaoContaView.getTxtDataAbertura().setText("");
                inclusaoContaView.getTxtCodigo().setText("");
                inclusaoContaView.getTxtValor().setText("0");
                inclusaoContaView.getChbAtiva().setSelected(false);
                inclusaoContaView.getChbInativa().setSelected(false);
                inclusaoContaView.setVisible(true);
            }
        });

        listaContasView.getBtnEditar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                editar();
            }
        });

        listaContasView.getBtnFechar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                listaContasView.dispose();
            }
        });

        listaContasView.getBtnExcluir().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                excluir();
            }
        });

        listaContasView.getBtnPesquisar().addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent ae) {
                pesquisar();
            }
        });

        carregaContas(contas.getTodasContas());

        this.listaContasView.setVisible(true);

    }

    private void carregaContas(TreeSet contas) {
        tm = new DefaultTableModel(new Object[][]{}, new String[]{"Codigo", "Saldo", "Data de Abertura", "Data de Fechamento", "Status"}) {
            @Override
            public boolean isCellEditable(int row, int col) {
                return false;
            }
        };
        tm.setNumRows(0);
        Iterator<Conta> it = contas.iterator();
        while (it.hasNext()) {
            Conta a = it.next();
            String linha = a.toString();
            String valores[] = linha.split("#");
            tm.addRow(valores);


        }
        this.listaContasView.getTblContas().setModel(tm);
    }

    private void pesquisar() {
        tm.setNumRows(0);
        TreeSet<Conta> contas1 = this.contas.getTodasContas();
        Iterator<Conta> it = contas1.iterator();
        while (it.hasNext()) {
            Conta a = it.next();
            int fim = listaContasView.getTxtFiltro().getText().length();

            String codigo = a.getCodigo();
            String filtro = listaContasView.getTxtFiltro().getText();

            if (codigo.length() < fim) {
                fim = codigo.length();
            }

            if (codigo.substring(0, fim).toUpperCase().equals(filtro.toUpperCase())) {
                String linha = a.toString();
                String valores[] = linha.split("#");
                tm.addRow(valores);
            }


        }
    }

    private void salvarConta() {
        Conta conta = new Conta(null, 0, null, null, null);
        String status = null;
        conta.setCodigo(inclusaoContaView.getTxtCodigo().getText().toString());
        conta.setSaldo(Double.parseDouble(inclusaoContaView.getTxtValor().getText().toString()));
        conta.setDataAbertura(inclusaoContaView.getTxtDataAbertura().getText().toString());
        if (inclusaoContaView.getChbAtiva().isSelected()) {
            status = "Ativa";
        } else if (inclusaoContaView.getChbInativa().isSelected()) {
            status = "Inativa";
        }
        conta.setStatus(status);
        if (conta.getCodigo().isEmpty() || conta.getDataAbertura().isEmpty() || conta.getStatus() == null) {
            JOptionPane.showMessageDialog(inclusaoContaView, "Preencha os campos em Branco");
        } else {
            contas.excluirConta(conta);
            contas.incluirConta(conta);
            this.carregaContas(contas.getTodasContas());
            inclusaoContaView.dispose();
            JOptionPane.showMessageDialog(listaContasView, "Conta Salva com Sucesso");

        }
    }

    private void editar() {
        if (listaContasView.getTblContas().getSelectedRow() != -1) {
            String codigo = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 0);
            String dataAbertura = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 2);
            String Status = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 4);
            Double saldo = Double.parseDouble((String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 1));
            Conta conta = new Conta(codigo, saldo, dataAbertura, null, Status);
            inclusaoContaView.getTxtCodigo().setText(codigo);
            inclusaoContaView.getTxtDataAbertura().setText(dataAbertura);
            inclusaoContaView.getTxtCodigo().setEnabled(false);
            inclusaoContaView.getTxtValor().setText(saldo.toString());
            if (Status.equals("Ativa")) {
                inclusaoContaView.getChbAtiva().setSelected(true);
            } else if (inclusaoContaView.getChbInativa().isSelected()) {
                inclusaoContaView.getChbInativa().setSelected(true);
            }
            inclusaoContaView.setVisible(true);
        } else {
            JOptionPane.showMessageDialog(listaContasView, "Selecione uma linha");
        }

    }

    private void excluir() {
        if (listaContasView.getTblContas().getSelectedRow() != -1) {
            if (JOptionPane.showConfirmDialog(listaContasView, "Deseja mesmo excluir essa Conta?") == 0) {
                Conta conta = new Conta(null, 0, null, null, null);
                String codigo = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 0);
                String dataAbertura = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 2);
                String Status = (String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 4);
                Double saldo = Double.parseDouble((String) listaContasView.getTblContas().getValueAt(listaContasView.getTblContas().getSelectedRow(), 1));
                conta.setCodigo(codigo);
                conta.setDataAbertura(dataAbertura);
                conta.setStatus(Status);
                conta.setSaldo(saldo);
                contas.excluirConta(conta);
                this.carregaContas(contas.getTodasContas());
                JOptionPane.showMessageDialog(listaContasView, "Conta excluida com Sucesso!");
            }
        } else {
            JOptionPane.showMessageDialog(listaContasView, "Selecione uma linha");
        }
    }
}
